package com.tedu.API.io;

import org.junit.Test;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * 标准流的写法: IO流处理异常对象
 *
 * 高级流: BufferedOutputStream  缓冲输出流    写   bos.txt
 *        BufferedInputStream   缓冲输入流   读入
 */
public class IOSAPI {
    /**
     * 缓冲输入流: 构造器--->异常对象
     *
     *  缓冲输入流: 具备功能: 合理传输数据 效率提高
     * 构造器具备: 添加字符集: UTF8万国码
     * new BufferedInputStream(低级流引用，size:存字节数组【指定】)
     *  问题1: 不能指定字符集
     *     2: 不能按照字符集读取
     */
    @Test
    public void testBIS(){
      /*  //创建低级流
        FileInputStream fis=new FileInputStream("bos.txt");
        //创建高级流---指定字符集---缓冲不具备功能---新【转换流】
        BufferedInputStream bos=new BufferedInputStream(fis);
        /**
         * read()---读: 一个字节，字节数组--->专门读文字
         */
        //bos.read();
    }

    /**
     * 针对于缓冲输出/输入功能上的限定---传输:文本
     * 字符流【转换流】--解决缓冲输入流读取单位为字节问题
     *     InputStreamReader: 读取单位为字符
     *     OutputStreamReader: 写出单位为字符形式    调用字符串getBytes写出
     *
     * 需求: 重新写---针对: 文字   写出文本: osw.txt
     */
    @Test
    public void testOSW(){
        //标准流: 1.置空流
        FileOutputStream fos=null;
        OutputStreamWriter osw=null;
        //标准流: 2.捕获异常
        try {
            //创建一个低级流
            fos=new FileOutputStream("osw.txt");
            //不考虑效率，只传输文本---字符输出流: 输出单位为字符形式
            //字符流: 都可以在构造器第二个参数指定编码集
            osw=new OutputStreamWriter(fos,"UTF8");
            //write()  直接写出文本【不需要将文本转换成字节数组】
            osw.write("给老铁来个双击~~~");
            osw.write("666\n");  //换行: 字符 char
            osw.write("777");
        } catch (FileNotFoundException e){  //文件不存在
            e.printStackTrace();
        } catch (UnsupportedEncodingException e){
            //字符集转换异常 写出: UTF8  读入: GDK
            e.printStackTrace();
        }
        catch (IOException e) {  //IO流异常: 所有在传输当中失败的总异常
            e.printStackTrace();
        } finally {
            //关闭高级流: 字符输出流
            if(osw!=null){ //if判断
            try {
                osw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

    /**
     * 高级流【又称处理流】---转换流【又叫字符流】,
     *                    特点: 套在低级流上，被其他高级流套用【传输单位:字符】
     * 字符输入流 ---单元测试: testISR()  读入   文本【不可以读入字符串】
     * 字符输出流 ---单元测试:testOSW()  写出    文本【字符串】
     * InputStreamReader  字符输入流   不可以读入文本
     *
     * 高级流【处理流】---转换流【字符流】---缓冲字符流: 读入、写出都是字符形式
     * BufferedReader  缓冲字符输入流--解决:InputStreamReader读入字节形式
     *                                   BufferedReader读入字符形式
     * BufferedWriter  缓冲字符输出流
     *
     * 需求: ISR字符输入流读取 osw.txt文件
     *      将当前代码转换为标准IO流: 捕获所有异常
     *      读取每行文本:  使用reader()  提示:数据不为空，代表有文本写出
     *      写出:给老铁来个双击~~666   参考: CV复制粘贴
     *          777
     */
    @Test
    public void testISR() {
        String line = null;
        BufferedReader br = null;
        InputStreamReader isr = null;
        FileInputStream fis = null;
        try {
            //1.创建低级流
            fis = new FileInputStream("osw.txt");
            //创建高级流当中的转换流，使用转换流当中的字符输入流
            //                    目的: 指定编码集---UTF8
            isr = new InputStreamReader(fis);
            //读   read()
            //问题: 读入数据单位: 字节，而不是字符，读字符
            //     转换流---套高级流: 缓冲字符输入流/输出流
            //继续创建高级流--针对转换流当中的字符输入流无法读取形式:
            //                           字符的情况---缓冲字符输入流
            br = new BufferedReader(isr);
            /**
             * BufferReader类
             * readLine() 读取到若干字符串，直到没有换行符为止
             *            一到换行就没有了
             */
            line= br.readLine();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (isr != null) {
                try {
                    isr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("打印读字符串: " + line);
    }
   /* @Test
    public void testISRHomeWork()  {
        // String line = null;
        BufferedReader br = null;
        InputStreamReader isr = null;
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("osw.txt");
            isr = new InputStreamReader(fis);
            br = new BufferedReader(isr);
            try (BufferedReader reader = new BufferedReader
                    ((new FileReader("osw.txt")))) {
                String line;
                try {
                    while (((line = br.readLine()) != null)) {
                        if (line.equals("老铁来个双击~~")) {
                            System.out.println();
                        } else if (line.equals("666")) {
                            System.out.println();
                        } else if (line.equals("777")) {
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
    }catch (IOException e){
                e.printStackTrace();
            }
        }catch (FileNotFoundException e){
            e.printStackTrace();
        } finally {
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (isr != null) {
                    try {
                        isr.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }*/

    @Test
    public void testISRHomeWork1() throws IOException {
       // String line = null;
        BufferedReader br = null;
        InputStreamReader isr = null;
        FileInputStream fis = null;
        fis = new FileInputStream("osw.txt");
        isr = new InputStreamReader(fis);
        br = new BufferedReader(isr);
        //接收输出字符串
        String line=null;
        //判断条件: 文本中一直有内容，一直读   一行文本
        while ((br.readLine()!=null)){
            System.out.println("打印读到字符串: "+line);
        }
        line = br.readLine();
    }


    /**
     * 作业2: 读取ISOAPI.java文件---所有代码---写出控制台
     */
    @Test
    public void testHomeWork2(){
        FileInputStream fis=null;
        InputStreamReader isr=null;
        BufferedReader br=null;
        try{
            //1.创建低级流---读入---找IOSAPI.java   代表路径: File.separator
        //路径: src\main\java\com\tedu\api\io\IOSAPI.java
        fis=new FileInputStream("src"+File.separator+"test"+
                File.separator+"java"+File.separator+"com"+
                File.separator+"tedu"+File.separator+"API"+File.separator+
                "io"+File.separator+"IOSAPI.java");
        //2.创建高级流---【读入内容为文本】---转换流---无法读取文本【int】
            isr=new InputStreamReader(fis);
        //3.创建高级流---缓冲输入流---读取文本
            br=new BufferedReader(isr);
        //4.创建变量: 字符串类型--白村每次读取到的一行文本
        String line=null; //null代表没有内容【等同于换行】

        //5.一直读入: 保存line中，如果line不为null，一直读
            while ((line= br.readLine())!=null){
                System.out.println("打印: "+line);
            }
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            //6.关闭高级流
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (isr != null) {
                try {
                    isr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    /**
     * BufferedWriter---低配版本输出流【缓冲输出流】
     * PrintWriter---高配版本输出流【字符输出流】
     * 1.高级流不能直接创建----直接创建【不需要创建低级流】---封装
     * 2.封装内存当中的所有流的特点
     *
     * 需求: 写出一个文件 pw.txt---文本内容，需要指定编码集: UTF8
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        //创建高级流   字符输出流: 打印 写
        PrintWriter fos=new PrintWriter("pw.txt");
        //高级流: 转换流  功能: 指定编码集
        PrintWriter osw=new PrintWriter("UTF8");
        //高级流: 缓冲流  功能: 提高效率
        PrintWriter bw=new PrintWriter(osw);
        //高级流: 低级流: 输出流+转换流+缓冲流
        PrintWriter pw=new PrintWriter(bw);
        //写出功能: print()  打印一行文本   不换行
        //         println()  打印一行文本  换行
        pw.println("你是我的");
        pw.println("小可爱~");
        pw.close();
    }
}
